package com.langfeiyes.pattern.proxy.dynamic.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk动态代理控制类，由它牵头代理类获取，代理方法的执行
 */
public class EmployeeInvocationHandler  implements InvocationHandler {

    //真实对象-EmployeeServiceImpl
    private Object target;

    public EmployeeInvocationHandler(Object target){
        this.target = target;
    }

    //获取jvm在内存中生成代理对象
    public Object getProxy(){
        return  Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    //代理对象控制执行方法
    //参数1：代理对象
    //参数2：真实对象的方法（使用方式得到方法对象）
    //参数3：真实对象方法参数列表
    //此处是代理对象对外暴露的可编辑的方法处理场所，代理对象每调用一个次方法，就会执行一次invoke
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String name = method.getName();
        if("save".equals(name) && !"admin".equals(SessionHolder.getCurrentUser())){
            throw new RuntimeException("当前非admin用户，不能执行save操作");
        }
        return method.invoke(target, args);
    }
}
